# the number of cpus guest platform has, default=1
#vcpus=1
+# enable/disable HVM guest PAE, default=0 (disabled)
+#pae=0
+
# enable/disable HVM guest ACPI, default=0 (disabled)
#acpi=0
*/
static int set_hvm_info(int xc_handle, uint32_t dom,
unsigned long *pfn_list, unsigned int vcpus,
- unsigned int acpi, unsigned int apic)
+ unsigned int pae, unsigned int acpi, unsigned int apic)
{
char *va_map;
struct hvm_info_table *va_hvm;
va_hvm->length = sizeof(struct hvm_info_table);
va_hvm->acpi_enabled = acpi;
va_hvm->apic_enabled = apic;
+ va_hvm->pae_enabled = pae;
va_hvm->nr_vcpus = vcpus;
set_hvm_info_checksum(va_hvm);
unsigned long shared_info_frame,
unsigned int control_evtchn,
unsigned int vcpus,
- unsigned int acpi,
+ unsigned int pae,
+ unsigned int acpi,
unsigned int apic,
unsigned int store_evtchn,
unsigned long *store_mfn)
goto error_out;
}
- if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi, apic) ) {
+ if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) ) {
fprintf(stderr, "Couldn't set hvm info for HVM guest.\n");
goto error_out;
}
const char *image_name,
unsigned int control_evtchn,
unsigned int vcpus,
- unsigned int acpi,
+ unsigned int pae,
+ unsigned int acpi,
unsigned int apic,
unsigned int store_evtchn,
unsigned long *store_mfn)
ctxt->flags = VGCF_HVM_GUEST;
if ( setup_guest(xc_handle, domid, memsize, image, image_size, nr_pages,
ctxt, op.u.getdomaininfo.shared_info_frame, control_evtchn,
- vcpus, acpi, apic, store_evtchn, store_mfn) < 0)
+ vcpus, pae, acpi, apic, store_evtchn, store_mfn) < 0)
{
ERROR("Error constructing guest OS");
goto error_out;
int memsize,
const char *image_name,
unsigned int control_evtchn,
- unsigned int lapic,
unsigned int vcpus,
+ unsigned int pae,
unsigned int acpi,
+ unsigned int apic,
unsigned int store_evtchn,
unsigned long *store_mfn)
{
int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom,
unsigned long nr_pfns, unsigned int store_evtchn,
unsigned long *store_mfn, unsigned int console_evtchn,
- unsigned long *console_mfn);
+ unsigned long *console_mfn);
int xc_linux_build(int xc_handle,
uint32_t domid,
const char *image_name,
unsigned int control_evtchn,
unsigned int vcpus,
+ unsigned int pae,
unsigned int acpi,
unsigned int apic,
unsigned int store_evtchn,
int control_evtchn, store_evtchn;
int memsize;
int vcpus = 1;
+ int pae = 0;
int acpi = 0;
int apic = 0;
unsigned long store_mfn = 0;
static char *kwd_list[] = { "dom", "control_evtchn", "store_evtchn",
- "memsize", "image", "vcpus", "acpi", "apic",
+ "memsize", "image", "vcpus", "pae", "acpi", "apic",
NULL };
- if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisiii", kwd_list,
+ if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisiiii", kwd_list,
&dom, &control_evtchn, &store_evtchn,
- &memsize, &image, &vcpus, &acpi, &apic) )
+ &memsize, &image, &vcpus, &pae, &acpi, &apic) )
return NULL;
if ( xc_hvm_build(self->xc_handle, dom, memsize, image, control_evtchn,
- vcpus, acpi, apic, store_evtchn, &store_mfn) != 0 )
+ vcpus, pae, acpi, apic, store_evtchn, &store_mfn) != 0 )
return PyErr_SetFromErrno(xc_error);
return Py_BuildValue("{s:i}", "store_mfn", store_mfn);
ImageHandler.configure(self, imageConfig, deviceConfig)
info = xc.xeninfo()
- if not 'hvm' in info['xen_caps']:
- raise VmError("Not an HVM capable platform, we stop creating!")
+ if not 'hvm' in info['xen_caps']:
+ raise VmError("Not an HVM capable platform, we stop creating!")
self.dmargs = self.parseDeviceModelArgs(imageConfig, deviceConfig)
self.device_model = sxp.child_value(imageConfig, 'device_model')
self.dmargs += self.configVNC(imageConfig)
+ self.pae = int(sxp.child_value(imageConfig, 'pae', 0))
+
self.acpi = int(sxp.child_value(imageConfig, 'acpi', 0))
self.apic = int(sxp.child_value(imageConfig, 'apic', 0))
log.debug("store_evtchn = %d", store_evtchn)
log.debug("memsize = %d", self.vm.getMemoryTarget() / 1024)
log.debug("vcpus = %d", self.vm.getVCpuCount())
+ log.debug("pae = %d", self.pae)
log.debug("acpi = %d", self.acpi)
log.debug("apic = %d", self.apic)
store_evtchn = store_evtchn,
memsize = self.vm.getMemoryTarget() / 1024,
vcpus = self.vm.getVCpuCount(),
+ pae = self.pae,
acpi = self.acpi,
apic = self.apic)
fn=set_int, default=None,
use="CPUS to run the domain on.")
+gopts.var('pae', val='PAE',
+ fn=set_int, default=0,
+ use="Disable or enable PAE of HVM domain.")
+
gopts.var('acpi', val='ACPI',
fn=set_int, default=0,
use="Disable or enable ACPI of HVM domain.")
def configure_hvm(config_image, vals):
"""Create the config for HVM devices.
"""
- args = [ 'device_model', 'vcpus', 'cdrom', 'boot', 'fda', 'fdb',
+ args = [ 'device_model', 'pae', 'vcpus', 'cdrom', 'boot', 'fda', 'fdb',
'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'audio',
'vnc', 'vncviewer', 'sdl', 'display', 'ne2000', 'acpi', 'apic',
'xauthority' ]
if ( validate_hvm_info(t) ) {
d->arch.hvm_domain.nr_vcpus = t->nr_vcpus;
d->arch.hvm_domain.apic_enabled = t->apic_enabled;
+ d->arch.hvm_domain.pae_enabled = t->pae_enabled;
} else {
printk("Bad hvm info table\n");
d->arch.hvm_domain.nr_vcpus = 1;
d->arch.hvm_domain.apic_enabled = 0;
+ d->arch.hvm_domain.pae_enabled = 0;
}
unmap_domain_page(p);
cpuid(input, &eax, &ebx, &ecx, &edx);
- if (input == 1)
+ if ( input == 1 )
{
if ( hvm_apic_support(v->domain) &&
!vlapic_global_enabled((VLAPIC(v))) )
clear_bit(X86_FEATURE_APIC, &edx);
#if CONFIG_PAGING_LEVELS < 3
- clear_bit(X86_FEATURE_PSE, &edx);
clear_bit(X86_FEATURE_PAE, &edx);
+ clear_bit(X86_FEATURE_PSE, &edx);
clear_bit(X86_FEATURE_PSE36, &edx);
#else
if ( v->domain->arch.ops->guest_paging_levels == PAGING_L2 )
{
+ if ( !v->domain->arch.hvm_domain.pae_enabled )
+ clear_bit(X86_FEATURE_PAE, &edx);
clear_bit(X86_FEATURE_PSE, &edx);
clear_bit(X86_FEATURE_PSE36, &edx);
}
unsigned long shared_page_va;
unsigned int nr_vcpus;
unsigned int apic_enabled;
+ unsigned int pae_enabled;
struct hvm_virpit vpit;
struct hvm_virpic vpic;
uint8_t checksum;
uint8_t acpi_enabled;
uint8_t apic_enabled;
- uint8_t pad[1];
+ uint8_t pae_enabled;
uint32_t nr_vcpus;
};